This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

library(sm)
Package 'sm', version 2.2-5.6: type help(sm) for summary information
library(ggplot2)
library(sqldf)
Loading required package: gsubfn
Loading required package: proto
Loading required package: RSQLite
getwd()
[1] "C:/Users/richa/OneDrive/Documents/Education/Stevens Institute/FE 800/Project/FE800HBS"
## see first 6 rows of the dataset
head(realDT)
## tail(realDT)
## check number of rows and columns
nrow(realDT)
[1] 38762
ncol(realDT)
[1] 7
## check date range of tweets
summary(realDT)
                 source     
 Twitter for Android:14545  
 Twitter Web Client :12182  
 Twitter for iPhone :10332  
 TweetDeck          :  483  
 TwitLonger Beta    :  405  
 Media Studio       :  156  
 (Other)            :  659  
                                                                                                                                      text      
 MAKE AMERICA GREAT AGAIN!                                                                                                              :   27  
 For all of those who have been asking about online sales the Donald J. Trump Signature Collection ties & shirts are sold @Macys.com:    5  
 PRESIDENTIAL HARASSMENT!                                                                                                               :    5  
 Success is not final failure is not fatal: it is the courage to continue that counts. -- Winston Churchill                             :    5  
                                                                                                                                        :    4  
 Achievers move forward at all times. Achievement is not a plateau it's a beginning.                                                    :    4  
 (Other)                                                                                                                                :38712  
           created_at    retweet_count    favorite_count        is_retweet        id_str         
                : 1682   Min.   :     0   0      : 2607              : 1740   Min.   :1.698e+09  
 5/1/2019 10:06 :    6   1st Qu.:    22          : 1682   1.01013E+17:    1   1st Qu.:3.581e+17  
 5/1/2019 9:56  :    6   Median :   300   1      :  682   1.15846E+17:    1   Median :5.623e+17  
 7/15/2018 13:33:    6   Mean   :  5621   2      :  404   9.84823E+16:    1   Mean   :5.958e+17  
 1/5/2015 3:26  :    5   3rd Qu.:  7716   15     :  309   FALSE      :35353   3rd Qu.:7.853e+17  
 11/20/2015 1:06:    5   Max.   :369530   12     :  305   TRUE       : 1666   Max.   :1.140e+18  
 (Other)        :37052   NA's   :1682     (Other):32773                       NA's   :1685       
stockdata <- read.csv("stockdata.csv", header = TRUE, sep = ",")
stockdata <- read.csv("stockdata.csv", header = TRUE, sep = ",")
head(stockdata)

##  Number of Rows in stock market data
nrow(stockdata)
[1] 244230
overnight_ret_1_min <- subset(stockdata, overnight_1 == 1) ## select the subject of returns that are from close of business to opening of next business day
Error in subset(stockdata, overnight_1 == 1) : 
  object 'stockdata' not found
sumtable <- matrix(c(max1, min1, mean1, sd1, max2, min2, mean2, sd2, max5, min5, mean5, sd5, max10, min10, mean10, sd10, max20, min20, mean20, sd20, max30, min30, mean30, sd30, max60, min60, mean60, sd60, max120, min120, mean120, sd120, max240, min240, mean240, sd240, max360, min360, mean360, sd360, maxon, minon, meanon, sdon), ncol = 4, byrow = TRUE)
colnames(sumtable) <- c("Max", "Min", "Mean", "Std. Dev")
rownames(sumtable) <- c("1 Minute", "2 Minutes", "5 Minutes", "10 Minutes", "20 Minutes", "30 Minutes", "60 Minutes", "120 Minutes", "240 Minutes", "360 Minutes", "Overnight")
sumtable <- as.table(sumtable)
sumtable
                      Max           Min          Mean      Std. Dev
1 Minute     8.887780e-03 -8.002421e-03 -3.765740e-07  3.050208e-04
2 Minutes    9.158534e-03 -8.227404e-03 -9.490496e-07  4.347683e-04
5 Minutes    1.516062e-02 -1.363070e-02 -2.457301e-06  6.873840e-04
10 Minutes   2.009808e-02 -1.607326e-02 -4.835746e-06  9.660964e-04
20 Minutes   2.637849e-02 -2.055613e-02 -8.298685e-06  1.356654e-03
30 Minutes   3.001411e-02 -2.723621e-02 -8.887243e-06  1.646093e-03
60 Minutes   2.620649e-02 -2.900513e-02 -1.492826e-05  2.292182e-03
120 Minutes  3.339548e-02 -3.113897e-02 -2.113782e-05  3.195499e-03
240 Minutes  3.312860e-02 -4.056254e-02 -2.838216e-05  4.608615e-03
360 Minutes  4.342457e-02 -3.497171e-02 -7.897112e-05  5.960260e-03
Overnight    1.586192e-02 -2.077167e-02  4.550390e-04  3.982014e-03
dt_max1 <- max(dt_ret_1_min$ret_1_min) #max return
no non-missing arguments to max; returning -Inf
dt_sumtable <- matrix(c(dt_max1, dt_min1, dt_mean1, dt_sd1, dt_max2, dt_min2, dt_mean2, dt_sd2, dt_max5, dt_min5, dt_mean5, dt_sd5, dt_max10, dt_min10, dt_mean10, dt_sd10, dt_max20, dt_min20, dt_mean20, dt_sd20, dt_max30, dt_min30, dt_mean30, dt_sd30, dt_max60, dt_min60, dt_mean60, dt_sd60, dt_max120, dt_min120, dt_mean120, dt_sd120, dt_max240, dt_min240, dt_mean240, dt_sd240, dt_max360, dt_min360, dt_mean360, dt_sd360, dt_maxon, dt_minon, dt_meanon, dt_sdon), ncol = 4, byrow = TRUE)
colnames(dt_sumtable) <- c("Max", "Min", "Mean", "Std. Dev")
rownames(dt_sumtable) <- c("1 Minute", "2 Minutes", "5 Minutes", "10 Minutes", "20 Minutes", "30 Minutes", "60 Minutes", "120 Minutes", "240 Minutes", "360 Minutes", "Overnight")
dt_sumtable <- as.table(dt_sumtable)
dt_sumtable
                      Max           Min          Mean      Std. Dev
1 Minute     3.660874e-03 -1.933951e-03  1.230258e-06  3.228175e-04
2 Minutes    4.386453e-03 -3.823998e-03  9.388884e-06  4.587222e-04
5 Minutes    5.573376e-03 -3.241616e-03 -4.039797e-06  6.703270e-04
10 Minutes   8.301536e-03 -5.582634e-03 -1.012057e-05  9.762170e-04
20 Minutes   1.283367e-02 -7.536593e-03 -2.597216e-05  1.383106e-03
30 Minutes   1.923196e-02 -7.771127e-03 -3.454241e-05  1.671035e-03
60 Minutes   2.019042e-02 -1.091749e-02 -7.117241e-05  2.217403e-03
120 Minutes  2.034899e-02 -2.138387e-02 -2.011246e-04  3.350048e-03
240 Minutes  1.133820e-02 -2.463258e-02 -4.410137e-04  4.211982e-03
360 Minutes  9.584493e-03 -2.672889e-02 -1.213914e-03  5.940661e-03
Overnight    5.374228e-03 -5.875397e-03 -4.290851e-04  3.136684e-03
## HISTOGRAM OF MINUTE BY MINUTE STOCK RETURNS
hist(ret_1_min$ret_1_min, 
     breaks = 500,
     main = "1 Minute Intraday Returns",
     xlab = "Minute Level Returns", 
     col = "Light Blue")

##  HISTOGRAM OF OVERNIGHT STOCK RETURNS
hist(overnight_ret_1_min$ret_1_min, 
     breaks = 100,
     main = "Overnight Returns",
     xlab = "End of Trading Day to Beginning of Next Trading Day Returns", 
     col = "Red")

##  CREATE DENSITY PLOT DISTRIBUTIONS
d1 <- density(ret_1_min$ret_1_min, from = -0.05, to = 0.05)
d2 <- density(ret_2_min$ret_2_min, from = -0.05, to = 0.05)
d5 <- density(ret_5_min$ret_5_min, from = -0.05, to = 0.05)
d10 <- density(ret_10_min$ret_10_min, from = -0.05, to = 0.05)
d20 <- density(ret_20_min$ret_20_min, from = -0.05, to = 0.05)
d30 <- density(ret_30_min$ret_30_min, from = -0.05, to = 0.05)
d60 <- density(ret_60_min$ret_60_min, from = -0.05, to = 0.05)
d120 <- density(ret_120_min$ret_120_min, from = -0.05, to = 0.05)
d240 <- density(ret_240_min$ret_240_min, from = -0.05, to = 0.05)
d360 <- density(ret_360_min$ret_360_min, from = -0.05, to = 0.05)
don <- density(overnight_ret_1_min$ret_1_min, na.rm = TRUE, from = -0.05, to = 0.05) #EXCLUDE NA VALUES FROM ANALYSIS (ERROR RESULTS IF YOU DON'T DO THIS)
##  PLOT DENSITY PLOTS
plot(d1, main = "Denstiy Plot: 1 Minute Returns", xlab = "Distribution of 1 Minute Returns") 
polygon(d1, col = "Light Blue", border = "Blue")

plot(d2, main = "Denstiy Plot: 2 Minute Returns", xlab = "Distribution of 2 Minute Returns")
polygon(d2, col = "Light Blue", border = "Blue")

plot(d5, main = "Denstiy Plot: 5 Minute Returns", xlab = "Distribution of 5 Minute Returns")
polygon(d5, col = "Light Blue", border = "Blue")

plot(d10, main = "Denstiy Plot: 10 Minute Returns", xlab = "Distribution of 10 Minute Returns")
polygon(d10, col = "Light Blue", border = "Blue")

plot(d20, main = "Denstiy Plot: 20 Minute Returns", xlab = "Distribution of 20 Minute Returns")
polygon(d20, col = "Light Blue", border = "Blue")

plot(d30, main = "Denstiy Plot: 30 Minute Returns", xlab = "Distribution of 30 Minute Returns")
polygon(d30, col = "Light Blue", border = "Blue")

plot(d60, main = "Denstiy Plot: 60 Minute Returns", xlab = "Distribution of 60 Minute Returns")
polygon(d60, col = "Light Blue", border = "Blue")

plot(d120, main = "Denstiy Plot: 120 Minute Returns", xlab = "Distribution of 120 Minute Returns")
polygon(d120, col = "Light Blue", border = "Blue")

plot(d240, main = "Denstiy Plot: 240 Minute Returns", xlab = "Distribution of 240 Minute Returns")
polygon(d240, col = "Light Blue", border = "Blue")

plot(d360, main = "Denstiy Plot: 360 Minute Returns", xlab = "Distribution of 360 Minute Returns")
polygon(d360, col = "Light Blue", border = "Blue")

plot(don, main = "Denstiy Plot: Overnight Returns", xlab = "Distribution of Overnight Returns")
polygon(don, col = "Light Green", border = "Green")

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLg0KDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KYGBge3IgTElCUkFSSUVTIEFORCBQQUNLQUdFU30NCiMjICBJTlNUQUxMIFJFUVVJUkVEIFBBQ0tBR0VTIEFORCBMSUJSQVJJRVMNCmluc3RhbGwucGFja2FnZXMoInNtIikNCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KaW5zdGFsbC5wYWNrYWdlcygic3FsZGYiKQ0KDQoNCiMjICBJTlNUQUxMIExJQlJBUklFUw0KbGlicmFyeShzbSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3FsZGYpDQpgYGANCg0KDQpgYGB7ciBTRVQgV09SS0lORyBESVJFQ1RPUll9DQpnZXR3ZCgpDQojc2V0d2QoIkM6L1VzZXJzL2hhcnNoaWwuYi5zaGFoL0RvY3VtZW50cy9HaXRIdWIvRkU4MDBIQlMiKQ0KI3NldHdkKCJDOi9Vc2Vycy9iaW50YS5kLnBhdGVsL0RvY3VtZW50cy9HaXRIdWIvRkU4MDBIQlMvRkU4MDBIQlMiKQ0Kc2V0d2QoIkM6L1VzZXJzL3JpY2hhL09uZURyaXZlL0RvY3VtZW50cy9FZHVjYXRpb24vU3RldmVucyBJbnN0aXR1dGUvRkUgODAwL1Byb2plY3QvRkU4MDBIQlMiKQ0KDQojIyByZWFkIERvbmFsZCBUcnVtcCB0d2VldHMgZG93bmxvYWRlZCBmcm9tIHRydW1wdHdpdHRlcmFyY2hpdmUuY29tIA0KcmVhbERUIDwtIHJlYWQuY3N2KCJEb25hbGRUcnVtcFR3ZWV0cy5jc3YiLGhlYWRlciA9IFRSVUUpDQoNCmBgYA0KDQpgYGB7cn0NCiMjIHNlZSBmaXJzdCA2IHJvd3Mgb2YgdGhlIGRhdGFzZXQNCmhlYWQocmVhbERUKQ0KDQojIyB0YWlsKHJlYWxEVCkNCmBgYA0KDQpgYGB7cn0NCiMjIGNoZWNrIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zDQpucm93KHJlYWxEVCkNCm5jb2wocmVhbERUKQ0KYGBgDQoNCmBgYHtyfQ0KIyMgY2hlY2sgZGF0ZSByYW5nZSBvZiB0d2VldHMNCnN1bW1hcnkocmVhbERUKQ0KYGBgDQoNCmBgYHtyIExPQUQgU1RPQ0sgREFUQX0NCiMjICBSZWFkIFN0b2NrIERhdGENCnN0b2NrZGF0YSA8LSByZWFkLmNzdigic3RvY2tkYXRhLmNzdiIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIsIikNCiMjICBTdW1tYXJpemUgU3RvY2sgRGF0YQ0KaGVhZChzdG9ja2RhdGEpDQojIyAgTnVtYmVyIG9mIFJvd3MgaW4gc3RvY2sgbWFya2V0IGRhdGENCm5yb3coc3RvY2tkYXRhKQ0KDQpgYGANCg0KYGBge3IgU1VCU0VUIFNUT0NLIERBVEEgfQ0KIyMgQ1JFQVRFIFNVQlNFVFMgT0YgVEhFIFNUT0NLIERBVEEgRk9SIERJRkZFUkVOVCBBTkFMWUlTUw0KDQpvdmVybmlnaHRfcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8xID09IDEpICMjIHNlbGVjdCB0aGUgc3ViamVjdCBvZiByZXR1cm5zIHRoYXQgYXJlIGZyb20gY2xvc2Ugb2YgYnVzaW5lc3MgdG8gb3BlbmluZyBvZiBuZXh0IGJ1c2luZXNzIGRheQ0KcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8xID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDEgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCnJldF8yX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfMiA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAyIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpyZXRfNV9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgb3Zlcm5pZ2h0XzUgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgNSBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KcmV0XzEwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfMTAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMTAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCnJldF8yMF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgb3Zlcm5pZ2h0XzIwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDIwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpyZXRfMzBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8zMCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAzMCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KcmV0XzYwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfNjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgNjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCnJldF8xMjBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8xMjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMTIwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpyZXRfMjQwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfMjQwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDI0MCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KcmV0XzM2MF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgb3Zlcm5pZ2h0XzM2MCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAzNjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCg0KYGBgDQoNCmBgYHtyIFNUQVRJU1RJQ1N9DQojIyAgU3RhdGlzdGljcyBhYm91dCAxLCAyLCA1LCAxMCwgMjAsIDMwLCA2MCwgMTIwLCAyNDAsIGFuZCAzNjAtbWludXRlIHJldHVybnMNCm1heDEgPC0gbWF4KHJldF8xX21pbiRyZXRfMV9taW4pICNtYXggcmV0dXJuDQptaW4xIDwtIG1pbihyZXRfMV9taW4kcmV0XzFfbWluKSAjbWluIHJldHVybg0KbWVhbjEgPC0gbWVhbihyZXRfMV9taW4kcmV0XzFfbWluKSAjbWVhbg0Kc2QxIDwtIHNkKHJldF8xX21pbiRyZXRfMV9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MiA8LSBtYXgocmV0XzJfbWluJHJldF8yX21pbikgI21heCByZXR1cm4NCm1pbjIgPC0gbWluKHJldF8yX21pbiRyZXRfMl9taW4pICNtaW4gcmV0dXJuDQptZWFuMiA8LSBtZWFuKHJldF8yX21pbiRyZXRfMl9taW4pICNtZWFuDQpzZDIgPC0gc2QocmV0XzJfbWluJHJldF8yX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXg1IDwtIG1heChyZXRfNV9taW4kcmV0XzVfbWluKSAjbWF4IHJldHVybg0KbWluNSA8LSBtaW4ocmV0XzVfbWluJHJldF81X21pbikgI21pbiByZXR1cm4NCm1lYW41IDwtIG1lYW4ocmV0XzVfbWluJHJldF81X21pbikgI21lYW4NCnNkNSA8LSBzZChyZXRfNV9taW4kcmV0XzVfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDEwIDwtIG1heChyZXRfMTBfbWluJHJldF8xMF9taW4pICNtYXggcmV0dXJuDQptaW4xMCA8LSBtaW4ocmV0XzEwX21pbiRyZXRfMTBfbWluKSAjbWluIHJldHVybg0KbWVhbjEwIDwtIG1lYW4ocmV0XzEwX21pbiRyZXRfMTBfbWluKSAjbWVhbg0Kc2QxMCA8LSBzZChyZXRfMTBfbWluJHJldF8xMF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MjAgPC0gbWF4KHJldF8yMF9taW4kcmV0XzIwX21pbikgI21heCByZXR1cm4NCm1pbjIwIDwtIG1pbihyZXRfMjBfbWluJHJldF8yMF9taW4pICNtaW4gcmV0dXJuDQptZWFuMjAgPC0gbWVhbihyZXRfMjBfbWluJHJldF8yMF9taW4pICNtZWFuDQpzZDIwIDwtIHNkKHJldF8yMF9taW4kcmV0XzIwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXgzMCA8LSBtYXgocmV0XzMwX21pbiRyZXRfMzBfbWluKSAjbWF4IHJldHVybg0KbWluMzAgPC0gbWluKHJldF8zMF9taW4kcmV0XzMwX21pbikgI21pbiByZXR1cm4NCm1lYW4zMCA8LSBtZWFuKHJldF8zMF9taW4kcmV0XzMwX21pbikgI21lYW4NCnNkMzAgPC0gc2QocmV0XzMwX21pbiRyZXRfMzBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDYwIDwtIG1heChyZXRfNjBfbWluJHJldF82MF9taW4pICNtYXggcmV0dXJuDQptaW42MCA8LSBtaW4ocmV0XzYwX21pbiRyZXRfNjBfbWluKSAjbWluIHJldHVybg0KbWVhbjYwIDwtIG1lYW4ocmV0XzYwX21pbiRyZXRfNjBfbWluKSAjbWVhbg0Kc2Q2MCA8LSBzZChyZXRfNjBfbWluJHJldF82MF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MTIwIDwtIG1heChyZXRfMTIwX21pbiRyZXRfMTIwX21pbikgI21heCByZXR1cm4NCm1pbjEyMCA8LSBtaW4ocmV0XzEyMF9taW4kcmV0XzEyMF9taW4pICNtaW4gcmV0dXJuDQptZWFuMTIwIDwtIG1lYW4ocmV0XzEyMF9taW4kcmV0XzEyMF9taW4pICNtZWFuDQpzZDEyMCA8LSBzZChyZXRfMTIwX21pbiRyZXRfMTIwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXgyNDAgPC0gbWF4KHJldF8yNDBfbWluJHJldF8yNDBfbWluKSAjbWF4IHJldHVybg0KbWluMjQwIDwtIG1pbihyZXRfMjQwX21pbiRyZXRfMjQwX21pbikgI21pbiByZXR1cm4NCm1lYW4yNDAgPC0gbWVhbihyZXRfMjQwX21pbiRyZXRfMjQwX21pbikgI21lYW4NCnNkMjQwIDwtIHNkKHJldF8yNDBfbWluJHJldF8yNDBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDM2MCA8LSBtYXgocmV0XzM2MF9taW4kcmV0XzM2MF9taW4pICNtYXggcmV0dXJuDQptaW4zNjAgPC0gbWluKHJldF8zNjBfbWluJHJldF8zNjBfbWluKSAjbWluIHJldHVybg0KbWVhbjM2MCA8LSBtZWFuKHJldF8zNjBfbWluJHJldF8zNjBfbWluKSAjbWVhbg0Kc2QzNjAgPC0gc2QocmV0XzM2MF9taW4kcmV0XzM2MF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4b24gPC0gbWF4KG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybT1UUlVFKSAjbWF4IHJldHVybiAoZXhjbHVkZXMgTkEgdmFsdWVzKQ0KbWlub24gPC0gbWluKG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybT1UUlVFKSAjbWluIHJldHVybiAoZXhjbHVkZXMgTkEgdmFsdWVzKQ0KbWVhbm9uIDwtIG1lYW4ob3Zlcm5pZ2h0X3JldF8xX21pbiRyZXRfMV9taW4sIG5hLnJtPVRSVUUpICNtZWFuIChleGNsdWRlcyBOQSB2YWx1ZXMpDQpzZG9uIDwtIHNkKG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybT1UUlVFKSAjc3RhbmRhcmQgZGV2aWF0aW9uIChleGNsdWRlcyBOQSB2YWx1ZXMpDQoNCg0KYGBgDQoNCmBgYHtyIFNVTU1BUlkgVEFCTEUgV0lUSCBTVEFUSVNUSUNTIFJFU1VMVFN9DQojIyAgQ3JlYXRlIFN1bW1hcnkgVGFibGUNCg0Kc3VtdGFibGUgPC0gbWF0cml4KGMobWF4MSwgbWluMSwgbWVhbjEsIHNkMSwgbWF4MiwgbWluMiwgbWVhbjIsIHNkMiwgbWF4NSwgbWluNSwgbWVhbjUsIHNkNSwgbWF4MTAsIG1pbjEwLCBtZWFuMTAsIHNkMTAsIG1heDIwLCBtaW4yMCwgbWVhbjIwLCBzZDIwLCBtYXgzMCwgbWluMzAsIG1lYW4zMCwgc2QzMCwgbWF4NjAsIG1pbjYwLCBtZWFuNjAsIHNkNjAsIG1heDEyMCwgbWluMTIwLCBtZWFuMTIwLCBzZDEyMCwgbWF4MjQwLCBtaW4yNDAsIG1lYW4yNDAsIHNkMjQwLCBtYXgzNjAsIG1pbjM2MCwgbWVhbjM2MCwgc2QzNjAsIG1heG9uLCBtaW5vbiwgbWVhbm9uLCBzZG9uKSwgbmNvbCA9IDQsIGJ5cm93ID0gVFJVRSkNCmNvbG5hbWVzKHN1bXRhYmxlKSA8LSBjKCJNYXgiLCAiTWluIiwgIk1lYW4iLCAiU3RkLiBEZXYiKQ0Kcm93bmFtZXMoc3VtdGFibGUpIDwtIGMoIjEgTWludXRlIiwgIjIgTWludXRlcyIsICI1IE1pbnV0ZXMiLCAiMTAgTWludXRlcyIsICIyMCBNaW51dGVzIiwgIjMwIE1pbnV0ZXMiLCAiNjAgTWludXRlcyIsICIxMjAgTWludXRlcyIsICIyNDAgTWludXRlcyIsICIzNjAgTWludXRlcyIsICJPdmVybmlnaHQiKQ0Kc3VtdGFibGUgPC0gYXMudGFibGUoc3VtdGFibGUpDQpzdW10YWJsZQ0KYGBgDQoNCg0KDQoNCmBgYHtyIERUIFRXRUVUIFNUT0NLREFUQX0NCiMjIENSRUFURSBTVUJTRVRTIE9GIFRIRSBTVE9DSyBEQVRBIFRIQVQgUkVQUkVTRU5UUyBUSEUgVElNRSBGUkFNRVMgQUZURVIgRE9OQUxEIFRSVU1QIFRXRUVUUw0KDQpkdF9vdmVybmlnaHRfcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEgJiBvdmVybmlnaHRfMSA9PSAxKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiByZXR1cm5zIHRoYXQgYXJlIGZyb20gY2xvc2Ugb2YgYnVzaW5lc3MgdG8gb3BlbmluZyBvZiBuZXh0IGJ1c2luZXNzIGRheQ0KZHRfcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEgJiBvdmVybmlnaHRfMSA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAxIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpkdF9yZXRfMl9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgZHR0d2VldGZsYWcgPT0gMSAmIG92ZXJuaWdodF8yID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDIgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCmR0X3JldF81X21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxICYgb3Zlcm5pZ2h0XzUgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgNSBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KZHRfcmV0XzEwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxICYgb3Zlcm5pZ2h0XzEwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDEwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpkdF9yZXRfMjBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEgJiBvdmVybmlnaHRfMjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCmR0X3JldF8zMF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgZHR0d2VldGZsYWcgPT0gMSAmIG92ZXJuaWdodF8zMCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAzMCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KZHRfcmV0XzYwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxICYgb3Zlcm5pZ2h0XzYwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDYwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpkdF9yZXRfMTIwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxICYgb3Zlcm5pZ2h0XzEyMCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAxMjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCmR0X3JldF8yNDBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEgJiBvdmVybmlnaHRfMjQwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDI0MCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KZHRfcmV0XzM2MF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgZHR0d2VldGZsYWcgPT0gMSAmIG92ZXJuaWdodF8zNjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMzYwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpgYGANCg0KYGBge3IgU1RBVElTVElDUyBEVH0NCiMjICBTdGF0aXN0aWNzIGFib3V0IDEsIDIsIDUsIDEwLCAyMCwgMzAsIDYwLCAxMjAsIDI0MCwgYW5kIDM2MC1taW51dGUgcmV0dXJucw0KZHRfbWF4MSA8LSBtYXgoZHRfcmV0XzFfbWluJHJldF8xX21pbikgI21heCByZXR1cm4NCmR0X21pbjEgPC0gbWluKGR0X3JldF8xX21pbiRyZXRfMV9taW4pICNtaW4gcmV0dXJuDQpkdF9tZWFuMSA8LSBtZWFuKGR0X3JldF8xX21pbiRyZXRfMV9taW4pICNtZWFuDQpkdF9zZDEgPC0gc2QoZHRfcmV0XzFfbWluJHJldF8xX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQpkdF9tYXgyIDwtIG1heChkdF9yZXRfMl9taW4kcmV0XzJfbWluKSAjbWF4IHJldHVybg0KZHRfbWluMiA8LSBtaW4oZHRfcmV0XzJfbWluJHJldF8yX21pbikgI21pbiByZXR1cm4NCmR0X21lYW4yIDwtIG1lYW4oZHRfcmV0XzJfbWluJHJldF8yX21pbikgI21lYW4NCmR0X3NkMiA8LSBzZChkdF9yZXRfMl9taW4kcmV0XzJfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmR0X21heDUgPC0gbWF4KGR0X3JldF81X21pbiRyZXRfNV9taW4pICNtYXggcmV0dXJuDQpkdF9taW41IDwtIG1pbihkdF9yZXRfNV9taW4kcmV0XzVfbWluKSAjbWluIHJldHVybg0KZHRfbWVhbjUgPC0gbWVhbihkdF9yZXRfNV9taW4kcmV0XzVfbWluKSAjbWVhbg0KZHRfc2Q1IDwtIHNkKGR0X3JldF81X21pbiRyZXRfNV9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KZHRfbWF4MTAgPC0gbWF4KGR0X3JldF8xMF9taW4kcmV0XzEwX21pbikgI21heCByZXR1cm4NCmR0X21pbjEwIDwtIG1pbihkdF9yZXRfMTBfbWluJHJldF8xMF9taW4pICNtaW4gcmV0dXJuDQpkdF9tZWFuMTAgPC0gbWVhbihkdF9yZXRfMTBfbWluJHJldF8xMF9taW4pICNtZWFuDQpkdF9zZDEwIDwtIHNkKGR0X3JldF8xMF9taW4kcmV0XzEwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQpkdF9tYXgyMCA8LSBtYXgoZHRfcmV0XzIwX21pbiRyZXRfMjBfbWluKSAjbWF4IHJldHVybg0KZHRfbWluMjAgPC0gbWluKGR0X3JldF8yMF9taW4kcmV0XzIwX21pbikgI21pbiByZXR1cm4NCmR0X21lYW4yMCA8LSBtZWFuKGR0X3JldF8yMF9taW4kcmV0XzIwX21pbikgI21lYW4NCmR0X3NkMjAgPC0gc2QoZHRfcmV0XzIwX21pbiRyZXRfMjBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmR0X21heDMwIDwtIG1heChkdF9yZXRfMzBfbWluJHJldF8zMF9taW4pICNtYXggcmV0dXJuDQpkdF9taW4zMCA8LSBtaW4oZHRfcmV0XzMwX21pbiRyZXRfMzBfbWluKSAjbWluIHJldHVybg0KZHRfbWVhbjMwIDwtIG1lYW4oZHRfcmV0XzMwX21pbiRyZXRfMzBfbWluKSAjbWVhbg0KZHRfc2QzMCA8LSBzZChkdF9yZXRfMzBfbWluJHJldF8zMF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KZHRfbWF4NjAgPC0gbWF4KGR0X3JldF82MF9taW4kcmV0XzYwX21pbikgI21heCByZXR1cm4NCmR0X21pbjYwIDwtIG1pbihkdF9yZXRfNjBfbWluJHJldF82MF9taW4pICNtaW4gcmV0dXJuDQpkdF9tZWFuNjAgPC0gbWVhbihkdF9yZXRfNjBfbWluJHJldF82MF9taW4pICNtZWFuDQpkdF9zZDYwIDwtIHNkKGR0X3JldF82MF9taW4kcmV0XzYwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQpkdF9tYXgxMjAgPC0gbWF4KGR0X3JldF8xMjBfbWluJHJldF8xMjBfbWluKSAjbWF4IHJldHVybg0KZHRfbWluMTIwIDwtIG1pbihkdF9yZXRfMTIwX21pbiRyZXRfMTIwX21pbikgI21pbiByZXR1cm4NCmR0X21lYW4xMjAgPC0gbWVhbihkdF9yZXRfMTIwX21pbiRyZXRfMTIwX21pbikgI21lYW4NCmR0X3NkMTIwIDwtIHNkKGR0X3JldF8xMjBfbWluJHJldF8xMjBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmR0X21heDI0MCA8LSBtYXgoZHRfcmV0XzI0MF9taW4kcmV0XzI0MF9taW4pICNtYXggcmV0dXJuDQpkdF9taW4yNDAgPC0gbWluKGR0X3JldF8yNDBfbWluJHJldF8yNDBfbWluKSAjbWluIHJldHVybg0KZHRfbWVhbjI0MCA8LSBtZWFuKGR0X3JldF8yNDBfbWluJHJldF8yNDBfbWluKSAjbWVhbg0KZHRfc2QyNDAgPC0gc2QoZHRfcmV0XzI0MF9taW4kcmV0XzI0MF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KZHRfbWF4MzYwIDwtIG1heChkdF9yZXRfMzYwX21pbiRyZXRfMzYwX21pbikgI21heCByZXR1cm4NCmR0X21pbjM2MCA8LSBtaW4oZHRfcmV0XzM2MF9taW4kcmV0XzM2MF9taW4pICNtaW4gcmV0dXJuDQpkdF9tZWFuMzYwIDwtIG1lYW4oZHRfcmV0XzM2MF9taW4kcmV0XzM2MF9taW4pICNtZWFuDQpkdF9zZDM2MCA8LSBzZChkdF9yZXRfMzYwX21pbiRyZXRfMzYwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQpkdF9tYXhvbiA8LSBtYXgoZHRfb3Zlcm5pZ2h0X3JldF8xX21pbiRyZXRfMV9taW4sIG5hLnJtPVRSVUUpICNtYXggcmV0dXJuIChleGNsdWRlcyBOQSB2YWx1ZXMpDQpkdF9taW5vbiA8LSBtaW4oZHRfb3Zlcm5pZ2h0X3JldF8xX21pbiRyZXRfMV9taW4sIG5hLnJtPVRSVUUpICNtaW4gcmV0dXJuIChleGNsdWRlcyBOQSB2YWx1ZXMpDQpkdF9tZWFub24gPC0gbWVhbihkdF9vdmVybmlnaHRfcmV0XzFfbWluJHJldF8xX21pbiwgbmEucm09VFJVRSkgI21lYW4gKGV4Y2x1ZGVzIE5BIHZhbHVlcykNCmR0X3Nkb24gPC0gc2QoZHRfb3Zlcm5pZ2h0X3JldF8xX21pbiRyZXRfMV9taW4sIG5hLnJtPVRSVUUpICNzdGFuZGFyZCBkZXZpYXRpb24gKGV4Y2x1ZGVzIE5BIHZhbHVlcykNCg0KDQpgYGANCg0KYGBge3IgU1VNTUFSWSBUQUJMRSBXSVRIIFNUQVRJU1RJQ1MgUkVTVUxUUyBEVH0NCiMjICBDcmVhdGUgU3VtbWFyeSBUYWJsZQ0KDQpkdF9zdW10YWJsZSA8LSBtYXRyaXgoYyhkdF9tYXgxLCBkdF9taW4xLCBkdF9tZWFuMSwgZHRfc2QxLCBkdF9tYXgyLCBkdF9taW4yLCBkdF9tZWFuMiwgZHRfc2QyLCBkdF9tYXg1LCBkdF9taW41LCBkdF9tZWFuNSwgZHRfc2Q1LCBkdF9tYXgxMCwgZHRfbWluMTAsIGR0X21lYW4xMCwgZHRfc2QxMCwgZHRfbWF4MjAsIGR0X21pbjIwLCBkdF9tZWFuMjAsIGR0X3NkMjAsIGR0X21heDMwLCBkdF9taW4zMCwgZHRfbWVhbjMwLCBkdF9zZDMwLCBkdF9tYXg2MCwgZHRfbWluNjAsIGR0X21lYW42MCwgZHRfc2Q2MCwgZHRfbWF4MTIwLCBkdF9taW4xMjAsIGR0X21lYW4xMjAsIGR0X3NkMTIwLCBkdF9tYXgyNDAsIGR0X21pbjI0MCwgZHRfbWVhbjI0MCwgZHRfc2QyNDAsIGR0X21heDM2MCwgZHRfbWluMzYwLCBkdF9tZWFuMzYwLCBkdF9zZDM2MCwgZHRfbWF4b24sIGR0X21pbm9uLCBkdF9tZWFub24sIGR0X3Nkb24pLCBuY29sID0gNCwgYnlyb3cgPSBUUlVFKQ0KY29sbmFtZXMoZHRfc3VtdGFibGUpIDwtIGMoIk1heCIsICJNaW4iLCAiTWVhbiIsICJTdGQuIERldiIpDQpyb3duYW1lcyhkdF9zdW10YWJsZSkgPC0gYygiMSBNaW51dGUiLCAiMiBNaW51dGVzIiwgIjUgTWludXRlcyIsICIxMCBNaW51dGVzIiwgIjIwIE1pbnV0ZXMiLCAiMzAgTWludXRlcyIsICI2MCBNaW51dGVzIiwgIjEyMCBNaW51dGVzIiwgIjI0MCBNaW51dGVzIiwgIjM2MCBNaW51dGVzIiwgIk92ZXJuaWdodCIpDQpkdF9zdW10YWJsZSA8LSBhcy50YWJsZShkdF9zdW10YWJsZSkNCmR0X3N1bXRhYmxlDQpgYGANCg0KDQoNCmBgYHtyIEhJU1RPR1JBTVN9DQoNCiMjIEhJU1RPR1JBTSBPRiBNSU5VVEUgQlkgTUlOVVRFIFNUT0NLIFJFVFVSTlMNCg0KaGlzdChyZXRfMV9taW4kcmV0XzFfbWluLCANCiAgICAgYnJlYWtzID0gNTAwLA0KICAgICBtYWluID0gIjEgTWludXRlIEludHJhZGF5IFJldHVybnMiLA0KICAgICB4bGFiID0gIk1pbnV0ZSBMZXZlbCBSZXR1cm5zIiwgDQogICAgIGNvbCA9ICJMaWdodCBCbHVlIikNCg0KIyMgIEhJU1RPR1JBTSBPRiBPVkVSTklHSFQgU1RPQ0sgUkVUVVJOUw0KDQpoaXN0KG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCANCiAgICAgYnJlYWtzID0gMTAwLA0KICAgICBtYWluID0gIk92ZXJuaWdodCBSZXR1cm5zIiwNCiAgICAgeGxhYiA9ICJFbmQgb2YgVHJhZGluZyBEYXkgdG8gQmVnaW5uaW5nIG9mIE5leHQgVHJhZGluZyBEYXkgUmV0dXJucyIsIA0KICAgICBjb2wgPSAiUmVkIikNCg0KYGBgDQoNCmBgYHtyIERFTlNJVFkgUExPVFN9DQoNCiMjICBDUkVBVEUgREVOU0lUWSBQTE9UIERJU1RSSUJVVElPTlMNCg0KZDEgPC0gZGVuc2l0eShyZXRfMV9taW4kcmV0XzFfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmQyIDwtIGRlbnNpdHkocmV0XzJfbWluJHJldF8yX21pbiwgZnJvbSA9IC0wLjA1LCB0byA9IDAuMDUpDQpkNSA8LSBkZW5zaXR5KHJldF81X21pbiRyZXRfNV9taW4sIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KQ0KZDEwIDwtIGRlbnNpdHkocmV0XzEwX21pbiRyZXRfMTBfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmQyMCA8LSBkZW5zaXR5KHJldF8yMF9taW4kcmV0XzIwX21pbiwgZnJvbSA9IC0wLjA1LCB0byA9IDAuMDUpDQpkMzAgPC0gZGVuc2l0eShyZXRfMzBfbWluJHJldF8zMF9taW4sIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KQ0KZDYwIDwtIGRlbnNpdHkocmV0XzYwX21pbiRyZXRfNjBfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmQxMjAgPC0gZGVuc2l0eShyZXRfMTIwX21pbiRyZXRfMTIwX21pbiwgZnJvbSA9IC0wLjA1LCB0byA9IDAuMDUpDQpkMjQwIDwtIGRlbnNpdHkocmV0XzI0MF9taW4kcmV0XzI0MF9taW4sIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KQ0KZDM2MCA8LSBkZW5zaXR5KHJldF8zNjBfbWluJHJldF8zNjBfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmRvbiA8LSBkZW5zaXR5KG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybSA9IFRSVUUsIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KSAjRVhDTFVERSBOQSBWQUxVRVMgRlJPTSBBTkFMWVNJUyAoRVJST1IgUkVTVUxUUyBJRiBZT1UgRE9OJ1QgRE8gVEhJUykNCg0KDQojIyAgUExPVCBERU5TSVRZIFBMT1RTDQoNCnBsb3QoZDEsIG1haW4gPSAiRGVuc3RpeSBQbG90OiAxIE1pbnV0ZSBSZXR1cm5zIiwgeGxhYiA9ICJEaXN0cmlidXRpb24gb2YgMSBNaW51dGUgUmV0dXJucyIpIA0KcG9seWdvbihkMSwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQyLCBtYWluID0gIkRlbnN0aXkgUGxvdDogMiBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDIgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkMiwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQ1LCBtYWluID0gIkRlbnN0aXkgUGxvdDogNSBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDUgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkNSwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQxMCwgbWFpbiA9ICJEZW5zdGl5IFBsb3Q6IDEwIE1pbnV0ZSBSZXR1cm5zIiwgeGxhYiA9ICJEaXN0cmlidXRpb24gb2YgMTAgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkMTAsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkMjAsIG1haW4gPSAiRGVuc3RpeSBQbG90OiAyMCBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDIwIE1pbnV0ZSBSZXR1cm5zIikNCnBvbHlnb24oZDIwLCBjb2wgPSAiTGlnaHQgQmx1ZSIsIGJvcmRlciA9ICJCbHVlIikNCnBsb3QoZDMwLCBtYWluID0gIkRlbnN0aXkgUGxvdDogMzAgTWludXRlIFJldHVybnMiLCB4bGFiID0gIkRpc3RyaWJ1dGlvbiBvZiAzMCBNaW51dGUgUmV0dXJucyIpDQpwb2x5Z29uKGQzMCwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQ2MCwgbWFpbiA9ICJEZW5zdGl5IFBsb3Q6IDYwIE1pbnV0ZSBSZXR1cm5zIiwgeGxhYiA9ICJEaXN0cmlidXRpb24gb2YgNjAgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkNjAsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkMTIwLCBtYWluID0gIkRlbnN0aXkgUGxvdDogMTIwIE1pbnV0ZSBSZXR1cm5zIiwgeGxhYiA9ICJEaXN0cmlidXRpb24gb2YgMTIwIE1pbnV0ZSBSZXR1cm5zIikNCnBvbHlnb24oZDEyMCwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQyNDAsIG1haW4gPSAiRGVuc3RpeSBQbG90OiAyNDAgTWludXRlIFJldHVybnMiLCB4bGFiID0gIkRpc3RyaWJ1dGlvbiBvZiAyNDAgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkMjQwLCBjb2wgPSAiTGlnaHQgQmx1ZSIsIGJvcmRlciA9ICJCbHVlIikNCnBsb3QoZDM2MCwgbWFpbiA9ICJEZW5zdGl5IFBsb3Q6IDM2MCBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDM2MCBNaW51dGUgUmV0dXJucyIpDQpwb2x5Z29uKGQzNjAsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkb24sIG1haW4gPSAiRGVuc3RpeSBQbG90OiBPdmVybmlnaHQgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIE92ZXJuaWdodCBSZXR1cm5zIikNCnBvbHlnb24oZG9uLCBjb2wgPSAiTGlnaHQgR3JlZW4iLCBib3JkZXIgPSAiR3JlZW4iKQ0KDQpgYGANCg0KYGBge3J9DQojIyBMT0FEIFRSVU1QIFRXRUVUUw0KDQpkdCA8LSByZWFkLmNzdigiZHRfdHdlZXRzLmNzdiIsIHNlcCA9ICIsIiwgaGVhZGVyID0gVFJVRSkNCmR0DQoNCmBgYA0KDQpgYGB7ciBUUlVNUCBUV0VFVCBEQVRBIFBST0ZJTElOR30NCiMjICBEQVRBIFBST0ZJTElORyBVU0lORyBTUUxERg0KDQojIyAgTnVtYmVyIG9mIFR3ZWV0cyBpbiB0aGUgRGF0YSBTZXQNCnNxbGRmKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSBkdCIpDQoNCmBgYA0KDQpgYGB7ciBDT1VOVCBPRiBUV0VFVFMgSU4gLyBPVVQgT0YgVFJBRElORyBIT1VSU30NCg0KIyMgIE51bWJlciBvZiBUd2VldHMgRHVyaW5nIC8gT3V0c2lkZSBvZiBUcmFkaW5nIEhvdXJzDQpzcWxkZigiU0VMRUNUIERVUklOR1RSQURJTkdIT1VSUywgQ09VTlQoKikNCiAgICAgIEZST00gZHQNCiAgICAgIEdST1VQIEJZIDEiKQ0KYGBgDQoNCmBgYHtyIEJBUiBQTE9UIE9GIFRSVU1QUyBUV0VFVFMgUEVSIEhPVVJ9DQoNCg0KIyMgIE51bWJlciBvZiBUd2VldHMgUGVyIEhvdXIgb2YgdGhlIERheQ0KRFQxIDwtIHNxbGRmKCdTRUxFQ1QgSE9VUiwgQ09VTlQoKikgYXMgbnVtdHdlZXRzIA0KICAgICAgRlJPTSBkdCANCiAgICAgIEdST1VQIEJZIGhvdXInKQ0KDQp4IDwtIDA6MjMgIyBORUVERUQgSU4gUExPVCBCRUxPVyBUTyBDUkVBVEUgWCBBWElTDQoNCmJhcnBsb3QoRFQxJG51bXR3ZWV0cywgDQogICAgICAgIG1haW4gPSAiRG9uYWxkIFRydW1wIFR3ZWV0cyBieSBIb3VyIG9mIHRoZSBEYXkiLA0KICAgICAgICB4bGFiID0gIkhvdXIgb2YgdGhlIERheSIsIA0KICAgICAgICB5bGFiID0gIk51bWJlciBvZiBUd2VldHMiLA0KICAgICAgICBjb2wgPSAibGlnaHQgYmx1ZSIsDQogICAgICAgIG5hbWVzLmFyZyA9IGMoeCksDQogICAgICAgIGNleC5sYWI9MSkNCmBgYA0KDQpgYGB7cn0NCg0KIyMgTnVtYmVyIG9mIFR3ZWV0cyBieSBZZWFyIGFuZCBNb250aA0KRFQyIDwtIHNxbGRmKCdTRUxFQ1QgWUVBUiwgTU9OVEgsIERBVEUsIENPVU5UKCopIGFzIG51bXR3ZWV0cw0KICAgICAgRlJPTSBkdA0KICAgICAgR1JPVVAgQlkgMSwgMiwgMycpDQoNCnBsb3QoRFQyJG51bXR3ZWV0cyx0eXBlID0gImwiLCANCiAgICAgbWFpbiA9ICJOdW1iZXIgb2YgVHdlZXRzIGJ5IERheSIsIA0KICAgICB4bGFiID0gIkRheSIsIA0KICAgICB5bGFiID0gIk51bWJlciBvZiBUd2VldHMiLCANCiAgICAgY29sID0gIkJsdWUiKQ0KDQpgYGANCg0K